假如有 java 应用程序:vitality-admin.jar。

# 关于 javaw

下面脚本中使用 javaw -jar vitality-admin.jar 的方式启动程序,意为后台启动,即不会出现命令提示符的黑窗口。

# javaw 启动/停止脚本

启动脚本 vitality.bat,有如下执行命令:

# 启动(vitality-admin.jar 和 vitality.bat 需要放在同一文件夹下。)
vitality.bat

# 然后需要键盘输入序号:1启动,2关闭,3重启,4启动状态,5退出
# 比如输入 1,就是启动的意思。
1
2
3
4
5

启动时,需要手动选择编号,1启动,2关闭,3重启,4启动状态,5退出。

rem 使用者应根据自身平台编码自行转换 防止乱码 例如 win使用gbk编码,可使用 windows 记事本设置编码。
@echo off

rem jar平级目录
set AppName=vitality-admin.jar

rem JVM参数
set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC"


ECHO.
	ECHO.  [1] 启动%AppName%
	ECHO.  [2] 关闭%AppName%
	ECHO.  [3] 重启%AppName%
	ECHO.  [4] 启动状态 %AppName%
	ECHO.  [5] 退 出
ECHO.

ECHO.请输入选择项目的序号:
set /p ID=
	IF "%id%"=="1" GOTO start
	IF "%id%"=="2" GOTO stop
	IF "%id%"=="3" GOTO restart
	IF "%id%"=="4" GOTO status
	IF "%id%"=="5" EXIT
PAUSE
:start
    for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
		set pid=%%a
		set image_name=%%b
	)
	if  defined pid (
		echo %%is running
		PAUSE
	)

start javaw %JVM_OPTS% -jar %AppName%

echo  starting……
echo  Start %AppName% success...
goto:eof

rem 函数stop通过jps命令查找pid并结束进程
:stop
	for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
		set pid=%%a
		set image_name=%%b
	)
	if not defined pid (echo process %AppName% does not exists) else (
		echo prepare to kill %image_name%
		echo start kill %pid% ...
		rem 根据进程ID,kill进程
		taskkill /f /pid %pid%
	)
goto:eof
:restart
	call :stop
    call :start
goto:eof
:status
	for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
		set pid=%%a
		set image_name=%%b
	)
	if not defined pid (echo process %AppName% is dead ) else (
		echo %image_name% is running
	)
goto:eof

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

# java 启动

由于 javaw 方式启动不会出现命令提示符黑窗口,并且通过 上面 vitality.bat 脚本内容启动的方式,需要手动选择序号来启动,这样就无法开机启动,并无法通过黑窗口看实时启动和运行日志。

因此下面提供一个简单的通过 java(而不是 javaw),启动的脚本(要关闭应用,直接关闭命令提示符黑窗口即可)。

# start.bat

@rem 使用者应根据自身平台编码自行转换 防止乱码 例如 win使用gbk编码
@echo off
title=Vitality-Service

@rem 延时启动。这里倒计时 30 秒开始启动应用
echo  启动倒计时:
timeout /T 30 /NOBREAK

rem jar平级目录
set AppName=vitality-admin.jar

rem JVM参数
set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"

echo  starting……
java %JVM_OPTS% -jar %AppName%
PAUSE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 开机自启

将程序 vitality-admin.jar 和启动脚本 start.bat 放在同一目录,如:

D:\work\vitality-admin.jar
D:\work\start.bat
1
2

创建 start.bat 的快捷方式,复制到 Windows 的启动目录下:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
# C:\ProgramData\Microsoft\Windows\「开始」菜单\程序\启动

# 比如:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\vitality_start.bat - 快捷方式
1
2
3
4
5

之后,只要重启操作系统,就可以自动打开命令提示符窗口,启动应用。

但这时候开机虽然启动了应用,但有一个命令提示符黑窗口出现在屏幕中央,我们希望开机启动的时候,自动最小化命令提示符黑窗口。这时候按照以下步骤设置:

  • 右键单击【vitality_start.bat - 快捷方式】,选择【属性】
  • 在【快捷方式】选项卡中,找到【运行方式】,默认值为【常规窗口】
  • 这里修改为【最小化】,然后保存即可。

# 如果依赖其他服务比如 Redis,需要先启动 Redis 再启动 vitality-admin.jar 怎么办?

假如有如下启动脚本:

D:\work\redis_start.bat
D:\work\vitality_start.bat
D:\work\start_all.bat
1
2
3

我们可以新增加一个 start_all.bat 脚本:

@echo off
title=Start-All

@rem /min: 启动时以最小化窗口的方式。
echo Redis Starting.....
start /min redis_start.bat

@rem 延时启动。这里延时时 30 秒开始启动应用。>nul 意思是不显示过程。
@rem 符号【>nul】等同于【1>nul】,是屏蔽操作成功显示的信息,但是出错还是会显示
@rem 符号【2>nul】是屏蔽操作失败显示的信息,如果成功依旧显示。
timeout /T 30 /NOBREAK >nul

@rem 如果不加 >nul 的话,命令如下:
@rem 此时命令提示符窗口会显示:等待 n 秒,按 CTRL+C 退出......
@rem 其中 n 是倒计时的秒数,会一直减一动态变化。
@rem 如果不想显示倒计时这个过程,就加上 >nul
echo  启动倒计时:
timeout /T 30 /NOBREAK

echo Vitality Starting.....
start /min vitality_start.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 关于 call 和 start 命令

call 和 start 命令都可以在一个 a.bat 中调用另一个 b.bat 脚本,但也有一些不同。

  • call: 通过call命令,我们可以调用另一个 bat 文件,执行完会再返回到原本的 bat 文件中继续执行。
  • start: 假如我们希望另外启动一个新的 cmd 窗口来运行 b.bat,可以通过 start 命令来实现